package com.coai.ai.service

import com.theokanning.openai.completion.chat.ChatMessage
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import org.springframework.stereotype.Service

/**
 * 智能销售助手引擎
 */
@Service
class SalesAssistantEngine(
    private val openAIService: OpenAIService
) {
    
    /**
     * 生成销售话术
     */
    suspend fun generateSalesScript(
        customerId: String,
        stage: SalesStage,
        context: SalesContext
    ): SalesScriptResponse = withContext(Dispatchers.IO) {
        
        // 1. 分析客户阶段
        val stageAnalysis = analyzeCustomerStage(context)
        
        // 2. 生成话术
        val script = generateScript(stage, context)
        
        // 3. 预测成交概率
        val dealProbability = predictDealProbability(context)
        
        // 4. 推荐下一步行动
        val nextActions = recommendNextActions(stage, dealProbability)
        
        // 5. 风险提示
        val risks = identifyRisks(context)
        
        SalesScriptResponse(
            script = script,
            dealProbability = dealProbability,
            nextBestActions = nextActions,
            risks = risks,
            insights = stageAnalysis
        )
    }
    
    /**
     * 生成话术
     */
    private suspend fun generateScript(
        stage: SalesStage,
        context: SalesContext
    ): String {
        val prompt = buildScriptPrompt(stage, context)
        
        val messages = listOf(
            ChatMessage("system", "你是一名资深销售顾问，擅长根据客户情况提供专业的销售话术。"),
            ChatMessage("user", prompt)
        )
        
        return openAIService.chatCompletion(messages, temperature = 0.8)
    }
    
    /**
     * 构建话术生成提示词
     */
    private fun buildScriptPrompt(stage: SalesStage, context: SalesContext): String {
        return """
            请为以下销售场景生成专业话术：
            
            销售阶段：${stage.description}
            
            客户信息：
            - 公司：${context.customerCompany ?: "未知"}
            - 行业：${context.industry ?: "未知"}
            - 规模：${context.companySize ?: "未知"}
            - 痛点：${context.painPoints.joinToString(", ")}
            
            产品信息：
            - 产品：${context.productName}
            - 特点：${context.productFeatures.joinToString(", ")}
            - 价值：${context.valueProposition}
            
            对话历史：
            ${context.conversationHistory.takeLast(5).joinToString("\n")}
            
            请生成：
            1. 开场白（如果需要）
            2. 核心话术（针对当前阶段）
            3. 常见异议处理
            4. 促成话术（如果适用）
            
            要求：
            - 专业、自然、有说服力
            - 突出产品价值与客户痛点的匹配
            - 包含具体案例或数据支撑
        """.trimIndent()
    }
    
    /**
     * 预测成交概率
     */
    private suspend fun predictDealProbability(context: SalesContext): Double {
        val prompt = """
            请根据以下销售线索信息，评估成交概率（0-1之间的数值）：
            
            客户信息：
            - 行业：${context.industry}
            - 规模：${context.companySize}
            - 预算：${context.budget}
            - 决策时间线：${context.timeline}
            
            互动情况：
            - 互动次数：${context.interactionCount}
            - 最近互动：${context.lastInteraction}
            - 响应速度：${context.responseSpeed}
            
            需求匹配度：
            - 痛点：${context.painPoints.joinToString(", ")}
            - 产品匹配度：${context.productFitScore}
            
            只返回概率数值（如0.75），不要其他内容。
        """.trimIndent()
        
        val messages = listOf(
            ChatMessage("system", "你是一个销售数据分析专家。"),
            ChatMessage("user", prompt)
        )
        
        val response = openAIService.chatCompletion(messages, temperature = 0.3)
        
        return try {
            response.toDouble().coerceIn(0.0, 1.0)
        } catch (e: Exception) {
            0.5 // 默认值
        }
    }
    
    /**
     * 分析客户所处阶段
     */
    private suspend fun analyzeCustomerStage(context: SalesContext): String {
        val prompt = """
            分析客户当前所处的购买阶段和心理状态：
            
            对话历史：
            ${context.conversationHistory.joinToString("\n")}
            
            请提供洞察分析。
        """.trimIndent()
        
        val messages = listOf(
            ChatMessage("system", "你是一个销售心理分析专家。"),
            ChatMessage("user", prompt)
        )
        
        return openAIService.chatCompletion(messages)
    }
    
    /**
     * 推荐下一步行动
     */
    private fun recommendNextActions(
        stage: SalesStage,
        probability: Double
    ): List<String> {
        val actions = mutableListOf<String>()
        
        when (stage) {
            SalesStage.FIRST_CONTACT -> {
                actions.add("了解客户基本信息")
                actions.add("识别关键决策人")
                actions.add("预约正式会谈")
            }
            SalesStage.NEED_DISCOVERY -> {
                actions.add("深入挖掘痛点")
                actions.add("量化问题影响")
                actions.add("确认预算范围")
            }
            SalesStage.DEMO -> {
                actions.add("准备定制化演示")
                actions.add("邀请决策层参与")
                actions.add("收集反馈意见")
            }
            SalesStage.NEGOTIATION -> {
                actions.add("准备价格方案")
                actions.add("处理异议")
                if (probability > 0.7) {
                    actions.add("推动签约")
                }
            }
            SalesStage.CLOSING -> {
                actions.add("发送合同")
                actions.add("跟进签约进度")
                actions.add("准备交付方案")
            }
        }
        
        return actions
    }
    
    /**
     * 识别风险
     */
    private fun identifyRisks(context: SalesContext): List<String> {
        val risks = mutableListOf<String>()
        
        if (context.budget == null || context.budget == "未明确") {
            risks.add("预算未明确")
        }
        
        if (context.timeline == null || context.timeline == "不确定") {
            risks.add("决策时间线不明确")
        }
        
        if (context.decisionMaker == null) {
            risks.add("未接触到决策人")
        }
        
        if (context.competitors.isNotEmpty()) {
            risks.add("竞争对手：${context.competitors.joinToString(", ")}")
        }
        
        return risks
    }
}

/**
 * 销售阶段
 */
enum class SalesStage(val description: String) {
    FIRST_CONTACT("初次接触"),
    NEED_DISCOVERY("需求挖掘"),
    DEMO("方案演示"),
    NEGOTIATION("谈判议价"),
    CLOSING("促成签约")
}

/**
 * 销售上下文
 */
data class SalesContext(
    val customerCompany: String?,
    val industry: String?,
    val companySize: String?,
    val painPoints: List<String>,
    val budget: String?,
    val timeline: String?,
    val decisionMaker: String?,
    val productName: String,
    val productFeatures: List<String>,
    val valueProposition: String,
    val conversationHistory: List<String>,
    val interactionCount: Int,
    val lastInteraction: String?,
    val responseSpeed: String?,
    val productFitScore: Double,
    val competitors: List<String> = emptyList()
)

/**
 * 销售话术响应
 */
data class SalesScriptResponse(
    val script: String,
    val dealProbability: Double,
    val nextBestActions: List<String>,
    val risks: List<String>,
    val insights: String
)
